import axios from 'axios';
import defaultSettings from '@/config/defaultSettings';
import { useMessage } from '@/hooks/common/useMessage';
import { deepClone } from '@/utils/util';
import { message } from 'ant-design-vue';
export const Axios = axios.create({
    // baseURL: '/api/',
    baseURL: '/main-api/',
    timeout: defaultSettings.apiTimeout
});
const { createConfirm } = useMessage();
// 存放请求列表
const pendingList = new Map();
// 插入请求数据
const addPending = (config) => {
    // 检测config中是否有取消重复请求字段
    if (config.cancelDuplicated) {
        return;
    }
    const uniqueKey = `${config.url}&${config.method}&${JSON.stringify(Object.keys(config.data))}&${JSON.stringify(Object.values(config.data))}`;
    config.cancelToken = new axios.CancelToken((c) => {
        pendingList.set(uniqueKey, c);
    });
};
// 移除请求数据
const removePending = (config) => {
    // 检测config中是否有取消重复请求字段
    if (config.cancelDuplicated) {
        return;
    }
    config = deepClone(config);
    // config.data在请求前是object,请求后是string类型
    config.data = typeof config.data === 'object' ? config.data : JSON.parse(config.data);
    // 不直接JSON.stringify(config.data)是因为请求前data是{key:value},请求后的data是{'key':'value'}格式，所以转成json字符串并不相等
    const uniqueKey = `${config.url}&${config.method}&${JSON.stringify(Object.keys(config.data))}&${JSON.stringify(Object.values(config.data))}`;
    if (pendingList.has(uniqueKey)) {
        pendingList.get(uniqueKey)(); // 取消接口调用
        pendingList.delete(uniqueKey);
    }
};
const convertUrl = (url: string | undefined, name: string) => {
    if (!url) {
        return;
    }
    // 替换为产品管理平台的url
    // const target = `/api/${name}`;
    const target = name;
    if (url.startsWith(target)) {
        // 兼容门户地址
        if (target === 'portal') {
            const targetIndex = url.indexOf('/');
            if (url.slice(0, targetIndex) !== 'portal') {
                return url;
            }
        }
        let { protocol, hostname } = document.location;
        // uac的21需要链接到23
        if (target === 'uac') {
            if (hostname === '10.141.42.21') {
                hostname = '10.141.42.23';
            }
        }
        const { production, otherPlatformUrl } = defaultSettings;
        const ip = production ? `${protocol}//${hostname}:${otherPlatformUrl[name].port}` : otherPlatformUrl[name].devTargetUrl;
        return url.replace(target, `${ip}/api`);
    } else {
        return url;
    }
};
Axios.interceptors.request.use(
    (config) => {
        // 转换为跨平台的url
        // acmdb
        config.url = convertUrl(config.url, 'acmdb');
        // uac
        if (config.url !== 'uacControl/getOrganizationTree' && config.url !== 'uacControl/getMenusByEmpId') {
            config.url = convertUrl(config.url, 'uac');
        }
        // portal
        if (config.url !== 'uacControl/getOrganizationTree' && config.url !== 'uacControl/getMenusByEmpId') {
            config.url = convertUrl(config.url, 'portal');
        }
        // 只移除post请求
        config.data && removePending(config);
        // 携带token
        if (localStorage.getItem('token')) {
            config.headers.Authorization = localStorage.getItem('token');
        }
        // 只插入post请求
        config.data && addPending(config);
        return config;
    },
    (error) => {
        return Promise.reject(error);
    }
);

// 返回状态判断(添加响应拦截器)
Axios.interceptors.response.use(
    (res) => {
        // 只移除post请求
        res.config.data && removePending(res.config);
        // 接口返回603回跳转到登陆页面，所以登陆页面最好不要调用任何可能会返回603的接口，不然一直循环
        if (!res.data.success && res.data.errorCode == 603) {
            localStorage.removeItem('token');
            location.href = '/';
            message.error('token丢失');
        }
        // 010弹出对应提示内容
        if (res.data.errorCode === '010') {
            createConfirm({
                title: '提示',
                content: res.data.errorMsg,
                iconType: 'warning',
                okText: '确定',
                keyboard: false,
                onOk: () => {}
            });
        }
        return res.data;
    },
    (error) => {
        let errorMsg = '';
        if (axios.isCancel(error)) {
            errorMsg = '请勿重复发送请求!';
        } else {
            if (error.message && error.message.includes('timeout')) {
                errorMsg = '请求超时!';
            } else {
                errorMsg = '请求异常!';
            }
        }
        return Promise.resolve({ success: false, errorMsg });
    }
);
export default Axios;
